package JavaGrammar;

/**
 * @author wys
 * created in 19:58 2019/2/28
 * Override 重写demo
 */

class Animal {

    public void move() {
        System.out.println(" 动物可以移动 ");
    }

    public void jump() {
        System.out.println(" 动物可以跳 ");
    }

}

class Dog extends Animal {

    @Override
    public void move() {
        System.out.println(" 狗可以跑和走 ");
    }

    public void bark() {
        System.out.println(" 狗可以吠叫");
    }

}

public class OverLoad_TestDog {

    public static void main(String args[]) {
        Animal animal = new Animal();
        Animal b = new Dog();
        animal.move();
        b.move();

        /**
         *  动物可以移动
         *  狗可以跑和走
         */

        /**
         * 在上面的例子中可以看到，尽管b属于Animal类型，但是它运行的是Dog类的move方法。
         *
         * 这是由于在编译阶段，只是检查参数的引用类型。
         *
         * 然而在运行时，Java虚拟机(JVM)指定对象的类型并且运行该对象的方法。
         *
         * 因此在上面的例子中，之所以能编译成功，是因为Animal类中存在move方法，然而运行时，运行的是特定对象的方法。
         */


        b.jump();

        // 父类类型的引用
//        b.bark();
        // 向下转换为子类就可以使用子类新的方法
//        ((Dog) b).bark();

        // 子类可以添加新的方法
        Dog dog = new Dog();
//        animal.move();
//        dog.move();
//        dog.bark();
        // 子类可以完全使用父类的方法
//        dog.jump();

    }

}
